//拓展语法：可变参数//阅读性不高
//public static int add(int... array){
//    int ret=0;
//    for( int i=0；i<array.length;i++){
//        ret+=array[i];
//    }
//    return ret;
//}

//final修饰引用，引用指向不能变，引用指向对象的值可变

import java.util.Arrays;
class Student {
    String name;
    int age;

    public Student(String name, int age) {
        this.name = name;
        this.age = age;
    }
}
public class Test {
    public static void main1(String[] args) {

        //方式1
        String str="Hello";
        //方式2
        String str2=new String("Hello");//上面是省略形式
        //方式3
        char[] values={'a','b','c','d'};
        String str3=new String(values);
        System.out.println(str==str2);
//        StringBuilder strr=new StringBuilder("haha");
//        strr.reverse();//字符串逆转
    }

    public static void main2(String[] args) {
        String str1="helloooo";
        String str2="oo";
        System.out.println(str1.contains(str2));
    }



    //-----------------------------
    //1.数组属性array.length  2.字符串方法str.length()
    //String str="";表示引用指向对象的指字符串为空
    //String str=null;表示引用不指向任何对象

    //------------------------------
    //equals()方法用来比较两个引用所指向的字符串对象当中的内容是否一致
    //str1.compareTo(str2);比较字符串大小
    //str1.compareToIgnoreCase(str2);忽略大小写比较大小

    //-----------------------------------
    //1.str.charAt(0);返回字符
    //2.str.indexOf('c');字符串中第一个串出现的位置，默认从0开始找
    //  str.indexOf('c',6);默认从6位置开始找
    //  str.indexOf("abcd");在主串当中寻找子串，默认从0开始找
    //  str.indexOf("abcd",6);默认从6位置开始
    //3.str.lastindexOf('c');从后往前找
    //  str.lastindexOf('c',6);从6位置从后往前找
    //  str.lastindexOf("abcd");从后往前找子串
    //  str.lastindexOf("abcd",6);默认从6位置从后往前找子串

    //------------------------------------
    //尽量使用paserint,valueof()比较低效
    public static void main00(String[] args) {
// 数字转字符串
        String s1 = String.valueOf(1234);
        String s2 = String.valueOf(12.34);
        String s3 = String.valueOf(true);
        String s4 = String.valueOf(new Student("Hanmeimei", 18));
        System.out.println(s1);
        System.out.println(s2);
        System.out.println(s3);
        System.out.println(s4);
        System.out.println("=================================");
// 字符串转数字
// 注意：Integer、Double等是Java中的包装类型，这个后面会讲到
        int data1 = Integer.parseInt("1234");
        double data2 = Double.parseDouble("12.34");
        System.out.println(data1);
        System.out.println(data2);

    }

    //------------------------------------
    //小写转大写：str1.toUpperCase();
    //大写转小写：str1.toLowerCase();

    //------------------------------------
    //str.toCharArray();字符串转数组
    //String s=String.format("%d %d %d",11,12,13);//格式化

    //-------------------------------------
    //字符串的替换
    //str1.replace('a','p');
    //str1.replace("ab","ooo");
    //str1.replaceAll("ab","666");
    //str1.replaceFirst("ab","999");

    //------------------------------------
//    String[] strs=str.split(" ");字符串的分割
//    String[] strs=str.split("&|=");字符串的分割
//    String[] strs=str.split(" ",2);至多分两组

    //--------------------------------------
    //str.substring(2);从2位置开始截取字符串
    //str.substring(2,6);截取[2,6)位置的字符串

    //-----------------------------------
    //str.trim()//删除字符串左右两边的空格

    //-----------------------------------
    //contains()用来判断字符串是否包含子串




    //-----------------------------------
    //1、双引号引起来的值就存在字符串常量池当中。
    //2、如果有就不再存储，直接返回字符串常量池的对象即可。





















    //-----------------------------------
    //在Java中所有双引号引起的都会被放在堆上的常量池当中，不可修改
    //字符串是不可变的：private final char value[];//因为存在private，并且没提供对外方法
    //不建议在循环中使用+对字符串进行拼接，会产生临时对象，效率非常低

    //-------------------------------------
    //StringBuilder和StringBuffer:关系到上厕所安不安全用StringBuffer()
    //String和StringBuilder：后者可修改





    //这里解决字符串不能修改为什么可以"abc"+"def"的问题：
    public static void main(String[] args) {
        String str="hello";
        str+="abc";//效率极低
        System.out.println(str);

        StringBuffer stringBuffer = new StringBuffer();


    }
    public static void main4(String[] args) {
        //上述代码的底层实现：
        String str = "hello";

        StringBuilder stringBuilder = new StringBuilder();
        stringBuilder.append(str);
        stringBuilder.append("abc");
        str=stringBuilder.toString();

        System.out.println(str);
    }

    //1、StringBulider和StringBuffer包含了String没有的一些方法，当然String有的，他两个也没有
    //2.字符串逆置使用reverse，不需要返回直接在原先字符串修改 .append(10).append("abc").append(19.9);
    //即它的这些方法直接在原对象上进行修改，不会产生临时对象
    //所以通常这样说：String不可变。StringBulider和StringBuffer可变。
    //StringBuffer和StringBulider方法都是一样的，区别是StringBuffer被synchronized（锁）修饰，（线程安全）用在多线程情况下。单线程下用StringBuilder
    //因为频繁的加锁和释放锁也是需要耗费系统资源的
}
